#-*- coding: utf-8 -*-
import urllib2
try :
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
    

#===============================================================================
# Récupère les data de l'api
#===============================================================================
xmlurl = 'https://api.eve-online.com/corp/AssetList.xml.aspx?keyID=2265134&vCode=7BnDrS2Qd4mECu8aUI5HTnfAPVhUnWjQH1RaUHfoOYOQ9tfofv3VDamWcJQCfbeO'
xmlFile = 'c:/wamp/www/eve_api_test/AssetList_2.xml'

def catchAssetsApi(url):
    #récupère le xml et crée un objet ElementTree xml
    try:
        xml = urllib2.urlopen(url)
        tree = ET.parse(xml)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)

def catchAssetsApiFile(xmlfile):
    #récupère le xml et crée un objet ElementTree xml
    try:
        tree = ET.parse(xmlfile)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)

#retourne les top elements (current time, cachedUntil, et le nb d'élément dans la racine)
def printApiMetadata(root):
    print "nb in root: ", len(root)
    print "Current time: ", root[0].text
    print "CachedUntil: ", root[2].text
    #renvoyer une liste avec ces valeurs

#pas usité pour le moment
def print_row(node, parentNode):
    #print "Rows : ", node, type(node)
    if parentNode is not None:
        print "    {0} : {1} - {2}".format(parentNode.get('itemID'), node.get('itemID'), node.attrib)
    else:
        print "{0} : {1}", format( node.get('itemID'), node.attrib)
        
#===============================================================================
# Début du parsing du contenu
#===============================================================================

def iterparent(tree):
    for parent in tree:
        for child in parent:
            yield parent, child



# def parse_subrow(node, attribute, attributeValue, subtag, parentLevel):
def parse_subrow(node, tag, parentLevel):
    y = 0
    z = parentLevel
    subLevel = []
    subLevel.append(0)
    espace = "    "
    control = True
    #node.iterfind(".//*[@name='contents']/row") => tous les noeud row qui sont enfants de noeuds ayant comme attribut "name" = "contents" 
    #=> plusieurs niveau justes => réstreindre à 1 niveau dans l'arbre 
    #[x] défini le nb d'éléments après le critère pas le niveau !!!
#     subrow = node.iterfind(".//*[@{0}='{1}']/[{2}]".format(attribute, attributeValue, subtag))
#     subrowCount = node.findall(".//*[@{0}='{1}']/[{2}]".format(attribute, attributeValue, subtag))

#     subrow = node.iterfind("./rowset/{0}".format(subtag))#ca marche, mais ça coupe l'iterateur, qui ne va pas plus loin que le 1er niveau
#     subrowCount = node.findall("./rowset/{0}".format(subtag))
#     context = node.getiterator('row')
#     subRows = node.findall('row')
#     print "Sub rows : ", subRows 
#     print "context : ", len(list(context))
    elemList = list(node.getiterator('row'))
    #retire le parent de la liste des noeuds   (ATTENTION SI QUE 1 ELEMENT ????)
    del elemList[0]
    return elemList
    
#     parentID = node.get('itemID')
#     print "    Sub - ",len(elemList)," :"
# 
#     for parent, child in iterparent(elemList):
#         print parent.get('itemID')," : ", child.get('itemID')




#     i=0
#     subElemList = list()
#     for subElement in elemList:
#         i+=1
#         if len(subElement.findall("./rowset/row")) == 0: 
#             print"    ",i," : ", subElement.get('itemID'), "no child"
#             #subElemList.append(subElement.get('itemID'))
#         elif len(subElement.findall("./rowset/row")) > 0:
#             print"    ",i," : ", subElement.get('itemID'), "HAS CHILDS!"
            
#     #print "    ",subElemList    
#     j=0
#     i=0
#     for parent in node.getiterator(tag):
#         j+=1
#         for child in parent.getiterator(tag) :
#             i+=1
#             #print z, ": ",j ,"-", i, "P : ", parent.get('itemID'), "- CH :", child.get('itemID')
#             if child is not None:
#                 #subContext= child.getiterator('row')
#                 #print "        sub context : ", subContext
#                 #parse_subrow(child, "row", i)
#                  isParent = True
#             else:
#                 print "no child"
#                 isParent = False
            
    
#     
#     subIter = context.next()
#     print "Sub iter : ", subIter    
#     print "Subrows : ", subRows
#     print "    Sub e : ", len(subRows)
# #     print "Subrow : ", subrowCount
# #     print "    Sub e : ", len(subrowCount)
#     if len(subrowCount) == 0:
#         subBool = False
#         tabulation = espace
#         
#     elif len(subrowCount) != 0:
#         subBool = True
#         subLevel.append(z)
#         print "    subLevel = ", len(subLevel)
#         tabulation = espace * len(subLevel)
#         
#     else :
#         print "Wrong value !!" 
#            
#     while control:
#         try:
#             if subrow is not None:   
#                 subElement = subrow.next()
#                 if subElement is not None:
#                     y+=1
#                     print tabulation , y, "-", subElement.get('itemID')
#                     if subBool == True:
#                         print "        sub sub el: ", subElement.findall(".//row")
#                         parse_subrow(subElement, "name", "contents", "row", y)
#                     #else:
#                         #pass        
#             else:
#                 print "node = None!!!???"      
#                         #print "        ", y , "-", node.get('itemID'), "/ ", subElement.get('itemID')                  
#                         #print "Sub-Element : {0} - {1} : {2} | __parent ID {3}".format( node.get('Lv'), subElement.get('Lv'), subElement.get('itemID'), node.get('itemID'))
#                         #print_row(subElement, node)
#                         #parse_subrow(subElement, "name", "contents", "row", z)
#         except StopIteration:
#             control = False

# fonction qui parcourt tous les noeuds avec comme tag "sutbag" contenus dans "node" dont les parents sont des noeuds qui ont un attribut "attribute" qui vaut "attributeValue"
def parse_row(node, attribute, attributeValue, subtag):
    y=0
    control= True
    #ça c'est juste! ça prendra que les premiers noeuds!
    #node.iterfind(".//*[@name='assets']/row") => tous les noeud row qui sont enfants de noeuds ayant comme attribut "name" = "assets" => Ok 1 seul niveau donc ça marche
    row = node.iterfind(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
    rowCount = node.findall(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
    print "Nombre de row : ", len(rowCount)
    while control:
        try:
            if row is not None:
                y+=1
                #parcours l'iterateur d'un cran de plus (passe à l'element suivant)
                element = row.next()
                print y, "-", element.get('itemID') 
                elist = parse_subrow(element, "row", y)
                print elist
                for subElement in elist:
                    subList = parse_subrow(subElement, "row", y)
                    if subList != []:
                        print
                    print "    ",subList
                #parse_subrow(element, "name", "contents", "row", y)
        except StopIteration:
            control = False

#===============================================================================
# début du programme - traitement du xml
#===============================================================================
root = catchAssetsApiFile(xmlFile)
parse_row(root, "name", "assets", "row")


#compter le nombre d'asset et sub asset ! => filtre iterfind doit s'arreter au 1er niveau en dessous.


        
          

    
